//
// Author: Vladimir Migashko <migashko@gmail.com>, (C) 2011
//
// Copyright: See COPYING file that comes with this distribution
//

#ifndef FASYS_FASYS_CHANNEL_INFO_HPP
#define FASYS_FASYS_CHANNEL_INFO_HPP

#include "types.hpp"

namespace fasys{


struct channel_info
{
  // Ахтунг! при добавлении полей не забываем f_channel_update
  /** INDEX. устанавлявается менеджером канала */
  channel_id_t channel_id;
  
  /** INDEX. Время уничтожения канала. Расчитывается так, чтобы совпадало с временем смерти последнего сообщения в канале  */
  time_t death_time;
  time_t create_time;
  time_t update_time;
  // время до которого сущетвует хотябы один подписчик
  // (время смерти последнего )
  // time_t subscribe_time;
  /** Счетчик идентификаторов сообщений для канала */
  message_id_t message_id_counter;
  size_t min_size;
  size_t max_size;

  /** INDEX. Имя канала*/
  std::string name;

  operator bool() const { return channel_id!=0;}

  channel_info()
    : channel_id(0)
    , death_time(0)
    , create_time(0)
    , update_time(0)
    , message_id_counter(0)
    , min_size(FASYS_MIN_CHANNEL_SIZE)
    , max_size(FASYS_MAX_CHANNEL_SIZE)
  {
  }

  void create(const std::string& name, channel_id_t channel_id)
  {
    time_t now = time(0);
    this->name = name;
    this->channel_id = channel_id;
    this->create_time = now;
    this->update_time = now;
  }

  void create(const std::string& name, channel_id_t channel_id, size_t min_size, size_t max_size)
  {
    this->create(name, channel_id);
    this->min_size = min_size;
    this->max_size = max_size;
  }

  void update(time_t timelife)
  {
    time_t now = time(0);
    this->update_time = now;
    time_t death_time = now + timelife;
    if ( this->death_time < death_time)
      this->death_time = death_time;
  }
};

}

#endif

